package com.company.aicrawlers.analysis;

import com.company.aicrawlers.entity.Product;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 商品识别器 - 关键词匹配方式
 *
 * @author AI Crawlers Team
 * @date 2025-10-11
 */
@Slf4j
@Component
public class ProductRecognizer {

    /**
     * 识别文本中的商品
     *
     * @param text     待识别的文本
     * @param products 商品列表
     * @return 匹配结果列表（按位置排序）
     */
    public List<ProductMatch> recognize(String text, List<Product> products) {
        if (text == null || text.trim().isEmpty()) {
            return Collections.emptyList();
        }

        if (products == null || products.isEmpty()) {
            log.warn("商品列表为空，无法识别");
            return Collections.emptyList();
        }

        List<ProductMatch> matches = new ArrayList<>();

        // 遍历所有商品，尝试匹配
        for (Product product : products) {
            List<String> keywords = getProductKeywords(product);

            // 尝试匹配每个关键词
            for (String keyword : keywords) {
                int index = text.indexOf(keyword);
                if (index >= 0) {
                    // 找到匹配
                    ProductMatch match = new ProductMatch();
                    match.setProduct(product);
                    match.setMatchedKeyword(keyword);
                    match.setPositionIndex(index);
                    matches.add(match);

                    log.debug("识别到商品：{} (关键词：{}, 位置：{})", product.getProductName(), keyword, index);

                    // 找到一个匹配就跳出（避免同一商品多次匹配）
                    break;
                }
            }
        }

        // 按位置排序
        matches.sort(Comparator.comparingInt(ProductMatch::getPositionIndex));

        // 设置排名
        for (int i = 0; i < matches.size(); i++) {
            matches.get(i).setRanking(i + 1);
        }

        log.info("识别完成：文本长度={}, 识别到商品数={}", text.length(), matches.size());

        return matches;
    }

    /**
     * 获取商品的关键词列表
     *
     * @param product 商品
     * @return 关键词列表（按优先级排序）
     */
    private List<String> getProductKeywords(Product product) {
        List<String> keywords = new ArrayList<>();

        // 1. 商品名称（最高优先级）
        if (product.getProductName() != null && !product.getProductName().trim().isEmpty()) {
            keywords.add(product.getProductName().trim());
        }

        // 2. 品牌+型号组合
        if (product.getBrand() != null && product.getModel() != null) {
            // 有空格
            keywords.add(product.getBrand() + " " + product.getModel());
            // 无空格
            keywords.add(product.getBrand() + product.getModel());
        }

        // 3. keywords字段（已经是List<String>类型，由JacksonTypeHandler自动处理）
        if (product.getKeywords() != null && !product.getKeywords().isEmpty()) {
            keywords.addAll(product.getKeywords());
        }

        // 4. aliases字段（已经是List<String>类型）
        if (product.getAliases() != null && !product.getAliases().isEmpty()) {
            keywords.addAll(product.getAliases());
        }

        // 去重
        keywords = keywords.stream().distinct().collect(Collectors.toList());

        // 按长度倒序（优先匹配长关键词，减少误匹配）
        keywords.sort((a, b) -> Integer.compare(b.length(), a.length()));

        return keywords;
    }

    /**
     * 商品匹配结果
     */
    @Data
    public static class ProductMatch {
        /**
         * 匹配到的商品
         */
        private Product product;

        /**
         * 匹配到的关键词
         */
        private String matchedKeyword;

        /**
         * 在文本中的位置索引（字符位置）
         */
        private Integer positionIndex;

        /**
         * 排名（按位置排序，1表示第一个）
         */
        private Integer ranking;
    }
}

